package com.yitiao.multithread.cas;

import java.util.concurrent.atomic.AtomicBoolean;

public class DubboCASExample {
    public static void main(String[] args) {
        /**
         * \u000d 相当于回车,会输出 hello
         */
        // \u000d System.out.println("hello");
        doClose(new AtomicBoolean(true));
    }
    private static void doClose(AtomicBoolean closed) {
        /**
         * 假设有两个线程 A 和 B 同时执行以下代码：
         * 线程 A 执行 compareAndSet(false, true)，此时 closed 的值为 false，线程 A 尝试将 closed 的值从 false 设置为 true。
         * 在线程 A 执行 CAS 操作的过程中，线程 B 也执行 compareAndSet(false, true)，由于 CAS 是原子性操作，只有一个线程能成功将 closed 的值从 false 设置为 true，另一个线程的 CAS 操作会失败。
         * 假设线程 A 成功将 closed 的值设置为 true，则线程 B 的 CAS 操作会失败，因为此时 closed 的值已经是 true。
         * 线程 B 在 CAS 操作失败后，会返回 false，表示未成功设置值，然后可以根据返回值进行相应的处理。
         *
         * CAS（Compare and Swap）通过硬件提供的原子性操作指令来保证原子性。即在执行过程中不会被中断。
         */

        if (!closed.compareAndSet(false, true)) {
            return;
        }
        /**
         * 假设有两个线程 A 和 B 同时执行以下代码：
         *
         * 线程 A 执行 if (closed.get() == true)，此时 closed 的值为 false，线程 A 获取到的值也为 false。
         * 在线程 A 执行完获取和比较后，线程 B 也执行 if (closed.get() == true)，此时 closed 的值仍为 false，线程 B 获取到的值也为 false。
         * 线程 A 和 B 都判断 closed 的值为 false，都会继续执行后续代码。
         * 这样就导致了多个线程同时通过了判断条件，可能会导致并发安全问题。
         */
        if (closed.get()==true){
            return;
        }
        System.out.println("stopBeat");
    }
}
